#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>

using namespace std;

void serialize()
{
    const char* name = "小明";
    int age = 19;
    float score[] = {77.5, 88, 99.5};

    Json::Value val;
    val["姓名"] = name;
    val["年龄"] = age;
    val["成绩"].append(score[0]);
    val["成绩"].append(score[1]);
    val["成绩"].append(score[2]);

    // 目的是用这个swb对象里面的newStreamWriter函数new一个空间
    Json::StreamWriterBuilder swb;
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

    // 承接序列化之后的字符串，传入一个数据流
    std::stringstream ss;
    int ret = sw->write(val, &ss);
    if (ret != 0)
    {
        cout << "write failed!" << endl;
        return;
    }

    cout << ss.str() << endl;
}

void unserialize(const std::string& str)
{
    // 反序列化得到的对象会存储在Json::Value对象里面去
    Json::Value val;

    // 目的是用srb这个对象里面的newCharReeader函数new一个空间
    Json::CharReaderBuilder srb;
    std::unique_ptr<Json::CharReader> cr(srb.newCharReader());

    std::string err;
    bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), &val, &err);
    if (ret == false)
    {
        cerr << "parse failed!" << endl;
        return;
    }

    cout << val["姓名"].asString() << endl;
    cout << val["年龄"].asString() << endl;
    int sz = val["成绩"].size();
    for (int i = 0; i < sz; i++)
    {
        cout << val["成绩"][i] << endl;
    }
}

int main()
{
    std::string str = R"({"姓名":"小黑", "年龄":18, "成绩":[66, 77]})";
    // serialize();
    unserialize(str);

    return 0;
}
